//
//  main.m
//  first-oc.class-method
//
//  Created by 郭志远 on 2023/11/22.
//
#import <Foundation/Foundation.h>
// 1.编写类的声明
@interface Iphone : NSObject
{

    @public
    float _model;
    int _cpu;
    double _size;
    int _color;
}

//行为
//OC中类方法用+表示，对象方法用-表示
//没参数没返回
- (void)about;
//没参数又返回
- (char *)loadMessage;
//有参数又返回
//注意：OC中的方法如果有采纳数，那么每个参数的数据类型前面必须加一个:
//冒号也是方法名的一部分
- (void)signal:(int)number;

- (int)sendMessageWithNumber:(int)number andContent:(char *)content;

//计算器
+ (int)sum:(int)value1  :(int)value2;

@end


// 2.如何编写类的实现

@implementation Iphone
- (void)about
{
    NSLog(@"打印本机信息");
}
- (char *)loadMessage
{
    return "sasas";
};

- (void)signal:(int)number
{
    NSLog(@"打电话给%i", number);
}
- (int)sendMessageWithNumber:(int)number andContent:(char *)content
{
    NSLog(@"发短信给%i,内容为%s", number, content);
    return 1;
}
+ (int)sum:(int)value1 :(int)value2
{
    return value1 + value2;
}
@end
int main(int argc, const char * argv[]) {
    //  如何通过一个类创建对象
    //  在OC中想要通过一个类创建一个对象，必须给类发一个消息（好比C语言中调用方法一样）
    //  如何发送消息？在OC中只要想发送消息就先写[类名称/对象名称 方法名称];
    //  发送什么消息（调用什么方法）可以创建一个对象？new
    
    /*
     只要通过一个类调用new方法，给这个类发送一个new的消息之后，内部就会做3件事
     1. 为Iphone类创建出来的对象分配存储空间
     2. 初始化Iphone类创建出来的对象中的属性
     3. 返回IPhone类创建出来的对象对应的地址
     */
    
    //通过一个Iphone类型的指针接收了Iphone对象的地址
    // 如果使用给一个指针保存了某一个对象的地址，那么我们就称这个指针为某个类型的对象
    // 利用Iphone类型的指针保存了Iphone对象的地址，那么我们就称Iphone类型的指针p为Iphone对象
    Iphone *p = [Iphone new];
    p->_color = 0;
    p->_cpu = 2;
    p->_model = 2.2;
    p->_size = 2.2;
    
    // OC中的类其实本职就是一个结构体，所以p这个指针其实就是指向了一个结构体
    NSLog(@"size = %f, color = %i, model = %f, cpu = %i",p->_size,p->_color,p->_model, p->_cpu);
    
    // 如何调用这个方法
    [p about];
    char *content = [p loadMessage];
    NSLog(@"content = %s", content);

    [p signal:123123];
    
   
//    [p sendMessage:123123 :"hello"];
    [p sendMessageWithNumber:123 andContent:"qweqw"];
    int res = [Iphone sum:30 :20];
    NSLog(@"res = %i",res);
    return 0;
}
